/**
 * @author: Gene
 * @age: 永远18岁的美少年
 * @Email： yangjianyun@58.com
 * @date: 2021-11-30 20:49:46
 * @description: 编译 Compiler 是一个类, 代表整个编译对象, 负责整个编译的过程, 里面会保存所有的 编译的信息
 * Compiler 类的实力, 全局唯一
 */
const {SyncHook} = require("tapable")
const Compilation = require("./Compilation")
const fs = require("fs")

// new SyncHook().tap('注册事件',()=>{})
class Compiler {
    constructor(options) {
        this.options = options
        // hook 里面存的是,当前的 compiler 上面的所有的钩子
        this.hooks = {
            run: new SyncHook(), // 开始编译时触发
            done: new SyncHook() // 编译结束时,触发
        }
    }

    // 4. 执行对象的 run 方法开始执行编译
    run(callback) {
        // 在执行 Compiler 的 run 方法开头, 去触发 run 这个钩子
        this.hooks.run.call()
        // ...... 编译过程 .....
        // 
        function onCompiled(err, stats, fileDependencies) {
            console.log("onCompiled");
            fileDependencies.forEach((fileDependency) => {
                // 监听文件的变更, 如果变化,重新编译
                fs.watch(fileDependency, () => this.compile(onCompiled))
            })
        }

        this.compile(onCompiled)
        //5. 根据配置中的`entry`找出入口文件

        //    结束编译时,触发 done
        this.hooks.done.call()
    }

    compile(onCompiled) {
        // 以后每次开启一次新的编译, 都会创建一个新的 Compilation 类的实例
        let compilation = new Compilation(this.options)
        compilation.build(onCompiled)

    }
}

module.exports = Compiler